package vwg.na.vwm.rh.motorsdk.modelo.procesos.servicios;

import java.util.Calendar;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import vwg.na.vwm.rh.modulo.pad.MontosMensuales;
import vwg.na.vwm.rh.modulo.pad.util.ResultadoEmpleado;
import vwg.na.vwm.rh.motorsdk.commons.entidades.Persona;
import vwg.na.vwm.rh.motorsdk.modelo.procesos.PadPlaneacionPersonalProceso;
import vwg.na.vwm.rh.motorsdk.modelo.procesos.dao.PadDefinicionBudgetDAO;
import vwg.na.vwm.rh.motorsdk.modelo.procesos.dao.PadPlaneacionPersonalDAO;
import vwg.na.vwm.rh.motorsdk.modelo.procesos.entidadesgrales.PadCapturaEjercicio;
import vwg.na.vwm.rh.motorsdk.modelo.procesos.entidadesgrales.PadDefinicionBudget;
import vwg.na.vwm.rh.motorsdk.modelo.procesos.entidadesgrales.PadEstadoPlaneacionPersonal;
import vwg.na.vwm.rh.motorsdk.modelo.procesos.entidadesgrales.PadPPTipoMovimiento;
import vwg.na.vwm.rh.motorsdk.modelo.procesos.servicios.ifaces.IPadPlaneacionPersonalServicio;
import vwg.na.vwm.rh.motorsdk.sesion.RHSesion;
import vwg.na.vwm.rh.rhmotor.modelo.entidad.Accion;
import vwg.na.vwm.rh.rhmotor.modelo.servicio.AccionServicio;
import vwg.na.vwm.rh.rhmotor.modelo.servicio.Core;
import vwg.na.vwm.rh.rhmotor.util.RHConstantes;

@Service
public class PadPlaneacionPersonalServicio implements IPadPlaneacionPersonalServicio {
	
	@Autowired
	PadDefinicionBudgetDAO padDefinicionBudgetDAO;
	
	@Autowired
	PadPlaneacionPersonalDAO padPlaneacionPersonalDAO;
	
	@Autowired
    private AccionServicio accionServicio;
    
	@Autowired
	private Core core;

	@Override
	public void saveDefinicionBudget(PadDefinicionBudget definicionBudget) {
		padDefinicionBudgetDAO.save(definicionBudget);
		processPlaneacionPersonal(definicionBudget);
	}

	@Override
	public void updateDefinicionBudget(PadDefinicionBudget definicionBudget) {
		padDefinicionBudgetDAO.update(definicionBudget);
		processPlaneacionPersonal(definicionBudget);
	}

	@Override
	public PadDefinicionBudget getDefinicionBudget(String unidadOrganizativa,
			String sociedad, int anio) {
		return padDefinicionBudgetDAO.getDefinicionBudget(unidadOrganizativa, sociedad, anio);
	}

	@Override
	public List<PadDefinicionBudget> getDefinicionBudgetHijas(
			String unidadOrganizativa, String sociedad, int anio) {
		return padDefinicionBudgetDAO.getDefinicionBudgetHijas(unidadOrganizativa, sociedad, anio);
	}

	@Override
	public List<PadPPTipoMovimiento> getTiposMovimiento() {
		return padPlaneacionPersonalDAO.getTiposMovimiento();
	}

	@Override
	public List<ResultadoEmpleado> findPersonal(String nombre,
			String paterno, String materno, String[] uos,String sociedad,
			String grado, String equidad, String evd) {
		return padPlaneacionPersonalDAO.findPersonal(nombre, paterno,
				materno, uos, sociedad, grado, equidad, evd);
	}

	@Override
	public PadPlaneacionPersonalProceso getPlaneacionPersonal(
			int definicionBudget) {
		return padPlaneacionPersonalDAO.getPlaneacionPersonal(definicionBudget);
	}

	@Override
	public PadEstadoPlaneacionPersonal getEstadoPlaneacion(int estado) {
		
		return padPlaneacionPersonalDAO.getEstadoPlaneacionPersonal(estado);
	}
	
	private PadPlaneacionPersonalProceso buildPlaneacionPlaneacion(PadDefinicionBudget definicion){
		
		PadPlaneacionPersonalProceso planeacion = new PadPlaneacionPersonalProceso();
		
		Persona usuario = (Persona)RHSesion.getVariableSesion(RHConstantes.CORE_USUARIO_PERSONA);
		
		planeacion.setTipoMovimiento("PP");
		planeacion.setPersonaAplica(usuario.getPersona());
		planeacion.setFechaAplica(Calendar.getInstance());
		planeacion.setPadDefinicionBudget(definicion);
		planeacion.setEstadoPlaneacionPersonal(getEstadoPlaneacion(1));
		
		return planeacion;
		
	}
	
	private void processPlaneacionPersonal(PadDefinicionBudget definicionBudget){
		PadPlaneacionPersonalProceso planeacion = getPlaneacionPersonal(
				definicionBudget.getDefinicionBudget());
		
		Accion accion = null;
		
		if(planeacion == null && definicionBudget.getHabilitadoCaptura() == 1){
			System.out.println("No existe planeacion, se crea una con accion: 101011");
			planeacion = buildPlaneacionPlaneacion(definicionBudget);
			accion = accionServicio.findById(101011);
			// crea pendiente
			core.guardarEntrada(planeacion, accion);
		}else if(planeacion != null){
			if(planeacion.getEstado().equals("C") && definicionBudget.getHabilitadoCaptura() == 1){
				System.out.println("Existe planeacion con estado C, se actualiza pendiente con una accion: 101011");
				accion = accionServicio.findById(101011);
			}else if(planeacion.getEstado().equals("P") && definicionBudget.getHabilitadoCaptura() == 0){
				System.out.println("Existe planeacion con estado P, se actualiza pendiente con una accion: 101012");
				accion = accionServicio.findById(101012);
			}
			if(accion != null){
				// Crear/ Borra pendiente
				core.guardarPendiente(planeacion, accion);
			}
		}
	}

	@Override
	public PadCapturaEjercicio getCapturaEjercicio() {
		return padPlaneacionPersonalDAO.getCapturaEjercicio();
	}

	@Override
	public MontosMensuales getMontosMensualesMovimientosPadre(String uoPadre, String sociedad, int anio) {
		return padPlaneacionPersonalDAO.getMontosMensualesMovimientosPadre(uoPadre, sociedad, anio);
	}
	
}
